package de.fhffm.gärtnerei.tabellenModelle;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.table.AbstractTableModel;

import de.fhffm.gärtnerei.tabellen.Aussaat;
import de.fhffm.gärtnerei.tabellen.Bewaesserung;
import de.fhffm.gärtnerei.tabellen.Pflanze;


@SuppressWarnings("serial")
public class BewaesserungTableModel extends AbstractTableModel {

	private EntityManager manager = Persistence.createEntityManagerFactory("test").createEntityManager(); 
	private int startPosition;
	private List<Bewaesserung> bewaesserungListe;
	private int zaehler = 0;
	
	public BewaesserungTableModel(){
		this.startPosition = 0;
		this.bewaesserungListe = getItems(startPosition, startPosition+100);
		
	}

	@Override
	public int getRowCount() {
		// gibt Zeilenanzahl als Long wert zurück
		return ((Long) manager.createQuery("SELECT COUNT(c) FROM Bewaesserung c").getSingleResult()).intValue();
	}

	@Override
	public int getColumnCount() {
		return 5;
	}
	
    public String getColumnName(int spalte) {
        
    	switch(spalte) {
            case 0:
                return "ID";
            case 1:
                return "Menge";
            case 2:
            	return "Datum";
            case 3:
            	return "AussaatID";
            case 4:
            	return "Pflanze";
            default:
                return "DEFAULT";
        }
    }

	@Override
	public Object getValueAt(int zeilenIndex, int spaltenIndex) {
		
		if((zeilenIndex >= startPosition) && (zeilenIndex < (startPosition+100))){
			/* Wenn die Zeile in dem vorher definierten Bereich liegt (standart ist 0-100)
			 * dann tuhe nix!
			 */
			
		}else {
			
			/*
			 * Falls die ausgewaehlte Zeile drueber liegt dan wird der Bereich neu gesetzt
			 * und die jeweiligen Items in diesem neuen bereich gehohlt
			 */
			this.bewaesserungListe = getItems(zeilenIndex,zeilenIndex+100);
			this.startPosition = zeilenIndex;
		}
		
		Bewaesserung bewaesserung;
		
		try{
			 bewaesserung = bewaesserungListe.get(zeilenIndex-startPosition);
			}catch(ArrayIndexOutOfBoundsException e){
				
				this.bewaesserungListe = getItems(startPosition, startPosition+100);
				bewaesserung = bewaesserungListe.get(zeilenIndex-startPosition);
				
			}

		
		Object toReturn = null;
		Aussaat aussaat = bewaesserung.getAussaat();
		
		switch(spaltenIndex){
		case 0:
			toReturn = bewaesserung.getBewaesserungID();
			break;
		case 1:
			toReturn = bewaesserung.getBewaesserungsMenge();
			break;
		case 2:
			toReturn = bewaesserung.getDatum();
			break;	
		case 3:
			toReturn = aussaat.getAussaatID();
			break;
		case 4:
			Pflanze pflanze = aussaat.getPflanze();
			toReturn = pflanze.getSorte();
			break;
	
		default:
			toReturn = bewaesserung.getBewaesserungID();
			
		}
		return toReturn;
	
	
	}
	
	private List<Bewaesserung> getItems(int von, int bis) {
		System.out.println("Anzahl Zugriffe auf die Tabelle Wachstum in der Datenbank "+zaehler++);
		Query query = manager.createQuery("SELECT b FROM Bewaesserung b").setMaxResults(bis-von).setFirstResult(von);
		
		List<Bewaesserung> resultList = query.getResultList();
		return resultList;
	}

}
